#include <mqueue.h>
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <string.h>

static char *mq_name = "/test_mq"; // 左边的/代表 /dev/mqueue
static mqd_t mq_fd; // 队列文件的文件描述符

void *first_thread_fun(void *arg)
{
    sleep(1);
    printf("first线程执行, 准备发送消息 \n");
    char *data = "atguigu";
    mq_send(mq_fd, data, strlen(data)+1, 1);
    return NULL;
}

void *second_thread_fun(void *arg)
{
    // sleep(1);
    printf("second线程执行， 准备接收消息 \n");
    char buf[100]; // 长度不能小于 msgsize
    // receive: 接收消息,如果队列没有消息，会阻塞， 直到有消息为止
    ssize_t len = mq_receive(mq_fd, buf, sizeof(buf), NULL);
    printf("接收到的消息是: %.*s, 长度是: %ld\n", (int)len, buf, len);

    return NULL;
}

int main(int argc, char const *argv[])
{
    printf("主线程开始执行\n");

    // 创建消息队列
    struct mq_attr attr;
    attr.mq_maxmsg = 10; // 消息队列中最多消息个数
    attr.mq_msgsize = 100; // 每个消息的最大字节数
    // fd: file descriptor  文件描述符  数值  文件的标识
    mq_fd = mq_open(mq_name, O_CREAT|O_RDWR, 0644, &attr);
    if (mq_fd == -1)
    {
        printf("创建消息队列失败\n");
        return -1;
    }

    pthread_t pt1,pt2;
    pthread_create(&pt1, NULL, first_thread_fun, NULL);
    pthread_create(&pt2, NULL, second_thread_fun, NULL);
    pthread_join(pt1, NULL);
    pthread_join(pt2, NULL);

    // 关闭消息队列
    mq_close(mq_fd);
    // 删除消息队列
    mq_unlink(mq_name);

    return 0;
}

